/*!
  \file Gvl3.c
 
  \brief OGSF library - loading volumes (lower level functions)
 
  GRASS OpenGL gsurf OGSF Library 
 
  (C) 1999-2008 by the GRASS Development Team
 
  This program is free software under the 
  GNU General Public License (>=v2). 
  Read the file COPYING that comes with GRASS
  for details.
  
  \author Tomas Paudits (December 2003)
  \author Doxygenized by Martin Landa <landa.martin gmail.com> (May 2008)
*/

#include <grass/gis.h>
#include <grass/G3d.h>
#include <grass/gstypes.h>
#include <grass/glocale.h>

/*!
  \brief Load color table

  \param[out] color_data color data buffer
  \param name 3D raster map name

  \return -1 on failure
  \return 1 on success
*/
int Gvl_load_colors_data(void **color_data, const char *name)
{
    const char *mapset;
    struct Colors *colors;

    if (NULL == (mapset = G_find_grid3(name,""))) {
	G_warning(_("3D raster map <%s> not found"), name);
        return (-1);
    }

    if (NULL == (colors = (struct Colors *) G_malloc(sizeof(struct Colors))))
         return (-1);

    if (0 > G3d_readColors(name, mapset, colors)) {
        G_free(colors);
        return (-1);
    }

    *color_data = colors;

    return (1);
}

/*!
  \brief Unload color table

  \param color_data color data buffer

  \return -1 on failure
  \return 1 on success
*/
int Gvl_unload_colors_data(void *color_data)
{
    if (!G_free_colors(color_data))
        return (-1);

    G_free(color_data);

    return (1);
}

/*!
  \brief Get color for value

  \param color_data color data value
  \param value data value

  \return color value
*/
int Gvl_get_color_for_value(void *color_data, float *value)
{
    int r, g, b;

    G_get_f_raster_color((FCELL *) value, &r, &g, &b, color_data);
    return ((r & 0xff) | ((g & 0xff) << 8) | ((b & 0xff) << 16));
}
